package com.netease.streamlearningbyjava;

import java.io.FileNotFoundException;
import java.util.Arrays;
import java.util.List;

public class MyClass {
    public static void main(String[] args) throws FileNotFoundException {
//        List<String> list = new ArrayList<>();
//        for (int i = 0; i < 10; i++) {
//            list.add("西门吹雪"+i);
//        }
//        Stream<String> stream = list.stream(); //获取一个顺序流
//        Stream<String> parallelStream = list.parallelStream(); //获取一个并行流
//        System.out.println("stream--->:"+stream);
//        System.out.println("parallelStream--->:"+parallelStream);
//
//        //数组转流
//        System.out.println("-----------------------数组转流-----------------------");
//        Integer[] nums = new Integer[10];
//        Stream<Integer> streamI = Arrays.stream(nums);
//        System.out.println("streamI--->:"+streamI);
        /*System.out.println("1.3 使用Stream中的静态方法：of()、iterate()、generate()");
        Stream<Integer> stream = Stream.of(1,2,3,4,5,6);

        Stream<Integer> stream2 = Stream
                .iterate(0, (x) -> x + 2)//迭代，从0开始，然后每个加2
                .limit(6);//限制为6个值
        stream2.forEach(System.out::println); // 0 2 4 6 8 10，for循环打印值

        Stream<Double> stream3 = Stream
                .generate(Math::random)//发生，参数是随机
                .limit(2);//允许两次
        stream3.forEach(System.out::println);*/
        /*System.out.println("1.4 使用 BufferedReader.lines() 方法，将每行内容转成流");
        BufferedReader reader = new BufferedReader(new FileReader("E:\\test_stream.txt"));//这里再指定盘里添加 test_stream.txt
        Stream<String> lineStream = reader.lines();
        lineStream.forEach(System.out::println);*/
        /*System.out.println("1.5 使用 Pattern.splitAsStream() 方法，将字符串分隔成流");
        Pattern pattern = Pattern.compile(",");
        Stream<String> stringStream = pattern.splitAsStream("a,b,c,d");
        stringStream.forEach(System.out::println);*/

        /*System.out.println("2. 流的中间操作\n" +
                "\n" +
                "2.1 筛选与切片");
        Stream<Integer> stream = Stream.of(6, 4, 6, 7, 3, 9, 8, 10, 12, 14, 14);
        *//**
         * filter：过滤流中的某些元素
         *         limit(n)：获取n个元素
         *         skip(n)：跳过n元素，配合limit(n)可实现分页
         *         distinct：通过流中元素的 hashCode() 和 equals() 去除重复元素
         *//*
        Stream<Integer> newStream = stream.filter(s -> s > 5) //6 6 7 9 8 10 12 14 14
                .distinct() //6 7 9 8 10 12 14,去重
                .skip(2) //9 8 10 12 14
                .limit(2); //9 8
        newStream.forEach(System.out::println);*/

        /**
         * 2.2 映射
         *         map：接收一个函数作为参数，该函数会被应用到每个元素上，并将其映射成一个新的元素。
         *         flatMap：接收一个函数作为参数，将流中的每个值都换成另一个流，然后把所有流连接成一个流。
         */
//        List<String> list = Arrays.asList("a,b,c", "1,2,3");
//
//        //将每个元素转成一个新的且不带逗号的元素
//        Stream<String> s1 = list.stream().map(s -> s.replaceAll(",", ""));
//        s1.forEach(System.out::println); // abc  123
//
//        Stream<String> s3 = list.stream().flatMap(s -> {
//            //将每个元素转换成一个stream
//            String[] split = s.split(",");
//            Stream<String> s2 = Arrays.stream(split);
//            return s2;
//        });
//        s3.forEach(System.out::println); // a b c 1 2 3
        /**
         * 2.3 排序
         *         sorted()：自然排序，流中元素需实现Comparable接口
         *         sorted(Comparator com)：定制排序，自定义Comparator排序器
         */
//        List<String> list = Arrays.asList("aa", "ff", "dd");
////String 类自身已实现Compareable接口
//        list.stream().sorted().forEach(System.out::println);// aa dd ff
//
//        Student s1 = new Student("aa", 10);
//        Student s2 = new Student("bb", 20);
//        Student s3 = new Student("aa", 30);
//        Student s4 = new Student("dd", 40);
//        List<Student> studentList = Arrays.asList(s1, s2, s3, s4);
//
////自定义排序：先按姓名升序，姓名相同则按年龄升序
//        studentList.stream().sorted(
//                (o1, o2) -> {
//                    if (o1.getName().equals(o2.getName())) {//如果名字相同
//                        return o1.getAge() - o2.getAge();
//                    } else {
//                        return o1.getName().compareTo(o2.getName());
//                    }
//                }
//        ).forEach(System.out::println);

        Student student = new Student("小强",1);
        Student student1 = new Student("小强",2);
        Student student2 = new Student("小强",5);
        Student student3 = new Student("小强",4);
        Student student4 = new Student("小强",9);
        Student student5 = new Student("小强",6);
        List<Student> students = Arrays.asList(student, student1, student2, student3, student4, student5);


    }

    private static class Student {
        private String name;
        private int age;

        public Student(String name, int age) {
            this.name = name;
            this.age = age;
        }

        public String getName() {
            return name;
        }

        public void setName(String name) {
            this.name = name;
        }

        public int getAge() {
            return age;
        }

        public void setAge(int age) {
            this.age = age;
        }
    }
}